package com.guguju.ssms.core.http;
import android.content.Intent;

import org.json.JSONObject;

import com.guguju.ssms.Guguju;
import com.guguju.ssms.constant.IntentParms;
import com.guguju.ssms.core.log.LogUtil;
import com.guguju.ssms.feature.login.LoginActivity;
import com.lzy.okgo.callback.AbsCallback;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import okhttp3.Call;
import okhttp3.Response;
/**
 * Created by dell on 2022-5-14.
 */
public abstract class JsonCallback<T> extends AbsCallback<T> {

    @Override
    public T convertSuccess(Response response) throws Exception {
        Type genType = getClass().getGenericSuperclass();
        //从上述的类中取出真实的泛型参数，有些类可能有多个泛型，所以是数值
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        //我们的示例代码中，只有一个泛型，所以取出第一个，得到如下结果
        //com.lzy.demo.model.LzyResponse<com.lzy.demo.model.ServerModel>
        Type type = params[0];

        // 这里这么写的原因是，我们需要保证上面我解析到的type泛型，仍然还具有一层参数化的泛型，也就是两层泛型
        // 如果你不喜欢这么写，不喜欢传递两层泛型，那么以下两行代码不用写，并且javabean按照
        // https://github.com/jeasonlzy/okhttp-OkGo/blob/master/README_JSONCALLBACK.md 这里的第一种方式定义就可以实现
        if (!(type instanceof ParameterizedType)) {
            throw new IllegalStateException("没有填写泛型参数");
        }
        //如果确实还有泛型，那么我们需要取出真实的泛型，得到如下结果
        //此时，rawType的类型实际上是 class，但 Class 实现了 Type 接口，所以我们用 Type 接收没有问题
        Type rawType = ((ParameterizedType) type).getRawType();
        //这里获取最终内部泛型的类型 com.lzy.demo.model.ServerModel
        Type typeArgument = ((ParameterizedType) type).getActualTypeArguments()[0];

        //这里我们既然都已经拿到了泛型的真实类型，即对应的 class ，那么当然可以开始解析数据了，我们采用 Gson 解析
        //以下代码是根据泛型解析数据，返回对象，返回的对象自动以参数的形式传递到 onSuccess 中，可以直接使用
        String result = response.body().string();
        LogUtil.json(result);
        if (typeArgument == Void.class) {
            //无数据类型,表示没有data数据的情况（以  new DialogCallback<LzyResponse<Void>>(this)  以这种形式传递的泛型)
            SimpleResponse simpleResponse = Convert.fromJson(result, SimpleResponse.class);
            response.close();
            return (T) simpleResponse.toBaseResponse();
        } else if (rawType == BaseResponse.class) {
            //有数据类型，表示有data
            JSONObject resultJson = new JSONObject(result);
            int code = resultJson.getInt("code");
            if (code == 200 || code > 2000) {
                BaseResponse baseResponse = Convert.fromJson(result, type);
                response.close();
                return (T) baseResponse;
            } else if (code == 500) {
                response.close();
                throw new IllegalStateException("服务器内部错误");
            } else if (code == 421) {
                response.close();
                toLoginActivity();
                throw new IllegalStateException("用户授权码错误");
            } else if (code == 413) {
                response.close();
                throw new IllegalStateException("提交参数值错误");
            }  else if (code == 410) {
                response.close();
                toLoginActivity();
                throw new IllegalStateException("缺少提交参数");
            } else if (code == 404) {
                response.close();
                throw new IllegalStateException("Token无效，需要重新登录");
            } else if (code == 414) {
                response.close();
                toLoginActivity();
                throw new IllegalStateException("验签失败");
            } else if (code == 403){
                response.close();
                toLoginActivity();
                throw new IllegalStateException("密码已在别处修改，请重新登陆");
            } else {
                response.close();
                throw new IllegalStateException("错误代码：" + code + "，错误信息：");
            }
        } else {
            response.close();
            throw new IllegalStateException("基类错误无法解析!");
        }
    }


    /**
     * 去登录页面
     */
    private void toLoginActivity() {
        if (!Guguju.isOpenLoginActivity) {
            Guguju.isOpenLoginActivity = true;
           if(Guguju.applicationContext!=null) {
               Intent intent = new Intent(Guguju.applicationContext, LoginActivity.class);
               intent.putExtra(IntentParms.LOGIN_FROM, IntentParms.LOGIN_FROM_HTTPLOAD);
               intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
               Guguju.applicationContext.startActivity(intent);
           }
        }
    }
}
